package com.titaniume.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @ProjectName: juc
 * @Package: com.titaniume.callable
 * @ClassName: Demo1
 * @Author: huangrenfei
 * @Description: 比较2中创建线程的方式
 * @Date: 2021/11/23 11:57
 * @Version: 1.0
 */

//实现Runnable接口
class  MyThread1 implements Runnable {

    @Override
    public void run() {

    }
}


//实现Callable 接口
class  MyThread2 implements Callable {

    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName()+" com in callable");
        return 200;
    }
}


public class Demo1 {
    public static void main(String[] args) throws Exception {

        //Runnable接口创建线程
        new Thread(new MyThread1(),"A线程").start();

        //Callable接口,报错
//        new Thread(new MyThread2(),"B线程").start();

        //FutureTask
        FutureTask<Integer> futureTask1 = new FutureTask<>(new MyThread2());

        //labmda 表达式方式
        FutureTask<Integer> futureTask2= new FutureTask<>(() -> {
            System.out.println(Thread.currentThread().getName()+"com in callable");
            return 123;
        });

        //创建一个线程
        new Thread(futureTask2,"luck").start();
        new Thread(futureTask1,"mary").start();

//        while (!futureTask2.isDone()){
//            System.out.println("wait.....");
//        }
        System.out.println("futureTask2第一次获取:"+futureTask2.get());
        //只需要计算一次 后面直接获取
        System.out.println("futureTask2第二次获取:"+futureTask2.get());

        System.out.println(futureTask1.get());

        System.out.println(Thread.currentThread().getName() +"com is over");


        //FutureTask原理  未来任务
        /**
         * 1、老师上课，口渴了，去买票不合适，讲课线程继续。
         *   单开启线程找班上班长帮我买水，把水买回来，需要时候直接get
         *
         * 2、4个同学， 1同学 1+2...5   ，  2同学 10+11+12....50， 3同学 60+61+62，  4同学 100+200
         *      第2个同学计算量比较大，
         *     FutureTask单开启线程给2同学计算，先汇总 1 3 4 ，最后等2同学计算位完成，统一汇总
         *
         * 3、考试，做会做的题目，最后看不会做的题目
         *
         * 汇总一次
         *
         */

    }
}
